package com.unlp.javaclickers.docente.vistas;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Set;

import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.border.LineBorder;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.hibernate.Transaction;

import com.unlp.javaclickers.docente.modelo.dao.impl.CondicionDAOImpl;
import com.unlp.javaclickers.helper.HibernateUtil;
import com.unlp.javaclickers.modelo.Condicion;
import com.unlp.javaclickers.modelo.Problema;

public class CrearCondicionProfesor {

	private JFrame frame;
	private Integer idProblema;
	private JFrame MainPregunta;
	private JTextField textNombre;
	private DefaultListModel<Condicion> modeloCondiciones;
	private JList<Problema> comboSiguientePregunta;
	private JTextField inputValorMinimo;
	private boolean editar;
	public Font fuente = new Font("Teen", Font.BOLD, 16);
	private JTextField inputValorMaximo;
	private Problema problema;
	private Condicion condicion;
	private static final Logger LOGGER = Logger
			.getLogger(CrearCondicionProfesor.class);

	public CrearCondicionProfesor() {
		initialize();
	}

	public CrearCondicionProfesor(Problema p) {
		this.problema = p;
		initialize();
	}

	public CrearCondicionProfesor(Problema p, boolean b) {
		this.condicion = new Condicion();
		this.problema = p;
		editar = b;
		initialize();
	}

	public CrearCondicionProfesor(Problema p, Condicion c, boolean b) {
		this.problema = p;
		this.condicion = c;
		editar = b;
		initialize();
	}

	private void initialize() {
		frame = new JFrame();
		frame.getContentPane().setBackground(Color.WHITE);
		frame.setBounds(100, 100, 544, 525);
		frame.setResizable(false);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(
				new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
		frame.setFont(fuente);

		JPanel panel = new JPanel();
		panel.setBackground(Color.WHITE);
		frame.getContentPane().add(panel);
		panel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));

		JLabel lblLogo = new JLabel("");
		lblLogo.setIcon(new ImageIcon(getClass().getResource("logo.PNG")));
		panel.add(lblLogo);

		JPanel panel_1 = new JPanel();
		panel_1.setBackground(Color.WHITE);
		frame.getContentPane().add(panel_1);
		panel_1.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));

		JLabel lblNombre = new JLabel(" Nombre                          ");
		panel_1.add(lblNombre);
		lblNombre.setFont(fuente);

		Condicion condicion = null;
		if (editar) {
			condicion = this.condicion;
		}

		textNombre = new JTextField();
		textNombre.setFont(fuente);
		if (editar) {
			textNombre.setText(condicion.getNombre());
		}
		panel_1.add(textNombre);
		textNombre.setColumns(10);

		JPanel panel_2 = new JPanel();
		panel_2.setBackground(Color.WHITE);
		frame.getContentPane().add(panel_2);

		JLabel lblVMinimo = new JLabel("Valor minimo (en porcentaje)           ");
		lblVMinimo.setFont(fuente);
		panel_2.add(lblVMinimo);

		inputValorMinimo = new JTextField();
		inputValorMinimo.setFont(fuente);
		if (editar) {
			inputValorMinimo.setText(condicion.getValorMin().toString());
		}
		panel_2.add(inputValorMinimo);
		inputValorMinimo.setColumns(10);

		JPanel panel_4 = new JPanel();
		panel_4.setBackground(Color.WHITE);
		frame.getContentPane().add(panel_4);

		JLabel label = new JLabel("Valor maximo (en porcentaje)           ");
		label.setFont(new Font("Teen", Font.BOLD, 16));
		panel_4.add(label);

		inputValorMaximo = new JTextField();
		inputValorMaximo.setFont(new Font("Teen", Font.BOLD, 16));
		if (editar) {
			inputValorMaximo.setText(condicion.getValorMax().toString());
		}
		inputValorMaximo.setColumns(10);
		panel_4.add(inputValorMaximo);

		JPanel panel_3 = new JPanel();
		panel_3.setBackground(Color.WHITE);
		frame.getContentPane().add(panel_3);

		JLabel lblSigProblema = new JLabel("Siguiente problema          ");
		lblSigProblema.setFont(fuente);
		panel_3.add(lblSigProblema);

		comboSiguientePregunta = new JList<Problema>();
		comboSiguientePregunta.setBorder(new LineBorder(new Color(0, 0, 0), 2));
		comboSiguientePregunta.setBackground(Color.WHITE);
		comboSiguientePregunta
				.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		DefaultListModel<Problema> model = new DefaultListModel<Problema>();
		Problema pro = this.problema;
		Set<Problema> problemas = pro.getClase().getProblemas();
		if (problemas != null) {
			for (Problema problema : problemas) {
				model.addElement(problema);
			}
		}
		comboSiguientePregunta.setModel(model);
		if (editar) {
			Problema pro2 = this.condicion.getProblemaSiguiente();
			if (pro2 != null) {
				comboSiguientePregunta.setSelectedValue(pro2.getNombre(), true);
			}
		}
		comboSiguientePregunta.setFont(fuente);
		// panel_3.add(comboSiguientePregunta);

		JScrollPane scrollPane = new JScrollPane(comboSiguientePregunta);
		panel_3.add(scrollPane);

		JPanel panel_6 = new JPanel();
		panel_6.setBackground(Color.WHITE);
		frame.getContentPane().add(panel_6);

		JButton btnCancelar = new JButton("Cancelar");
		btnCancelar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				getMainPregunta().setVisible(true);
				getFrame().setVisible(false);
			}
		});
		btnCancelar.setFont(fuente);
		panel_6.add(btnCancelar);

		JButton btnGuardar = new JButton("Guardar");
		btnGuardar.addActionListener(new ActionListener() {
			// TODO : Validar que no exista una condicion con el mismo nombre
			public void actionPerformed(ActionEvent e) {
				if (!StringUtils.isEmpty(inputValorMinimo.getText())
						&& !StringUtils.isEmpty(textNombre.getText())) {
					CrearCondicionProfesor.this.problema.getCondiciones()
							.remove(CrearCondicionProfesor.this.condicion);
					modeloCondiciones
							.removeElement(CrearCondicionProfesor.this.condicion);
					CrearCondicionProfesor.this.condicion.setNombre(textNombre
							.getText());
					CrearCondicionProfesor.this.condicion.setValorMax(Integer
							.parseInt(inputValorMaximo.getText()));
					CrearCondicionProfesor.this.condicion.setValorMin(Integer
							.parseInt(inputValorMinimo.getText()));
					CrearCondicionProfesor.this.condicion
							.setProblema(CrearCondicionProfesor.this.problema);

					if (comboSiguientePregunta.getModel().getSize() != 0
							&& comboSiguientePregunta.getSelectedValue() != null) {
						Problema problema = comboSiguientePregunta
								.getSelectedValue();
						if (problema != null) {
							CrearCondicionProfesor.this.condicion
									.setProblemaSiguiente(problema);
						}
					} else {
						LOGGER.warn(String
								.format("No se selecciona un problema siguiente para la condicion %s del problmea %s",
										CrearCondicionProfesor.this.condicion
												.getNombre(),
										CrearCondicionProfesor.this.problema
												.getNombre()));
					}
					CondicionDAOImpl cd = new CondicionDAOImpl(HibernateUtil
							.getSessionFactory());
					Transaction t2 = HibernateUtil.getSessionFactory()
							.getCurrentSession().beginTransaction();
					cd.save(CrearCondicionProfesor.this.condicion);
					t2.commit();
					CrearCondicionProfesor.this.problema.getCondiciones().add(
							CrearCondicionProfesor.this.condicion);
					getMainPregunta().setVisible(true);
					getFrame().setVisible(false);
					modeloCondiciones
							.addElement(CrearCondicionProfesor.this.condicion);
				} else {
					JOptionPane.showMessageDialog(frame, "Complete los campos");
				}

			}

		});
		btnGuardar.setFont(fuente);
		panel_6.add(btnGuardar);
	}

	public JFrame getFrame() {
		return frame;
	}

	public void setFrame(JFrame frame) {
		this.frame = frame;
	}

	public JFrame getMainPregunta() {
		return MainPregunta;
	}

	public void setMainPregunta(JFrame mainPregunta) {
		MainPregunta = mainPregunta;
	}

	public Integer getIdProblema() {
		return idProblema;
	}

	public void setIdProblema(Integer idProblema) {
		this.idProblema = idProblema;
	}

	public DefaultListModel<Condicion> getModeloCondiciones() {
		return modeloCondiciones;
	}

	public void setModeloCondiciones(
			DefaultListModel<Condicion> modeloCondiciones) {
		this.modeloCondiciones = modeloCondiciones;
	}

}
